#ifndef XML_TEXTSTREAM_H_
#define XML_TEXTSTREAM_H_
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class ChpProp 
{
public:
    ChpProp();
    ChpProp(const ChpProp& chpprop);
    string GetAltLang() const;
    void SetAltLang(string altlang);
    string GetLang() const;
    void SetLang(string lang);
    
    string m_alt_language_0;
    string m_language_0;

private:
    string m_alt_language_;
    string m_language_;
};

// class ChpProp1 
// {
// public:
//     ChpProp1();
//     ChpProp1(const ChpProp1& chpprop1);
//     string GetAltLang1() const;
//     void SetAltLang1(string altlang1);
//     string GetLang1() const;
//     void SetLang1(string lang1);

// private:
//     string m_alt_language_1;
//     string m_language_1;
// };

class PapProp 
{
public:
    PapProp();
    PapProp(const PapProp& papprop);
    string GetAlignMode() const;
    void SetAlignMode(string aligmode);

private:
    string m_align_mode_;
};

//tag:object of Chp array
class CabsObject
{
public:
    CabsObject();
    CabsObject(const CabsObject& cabsobj);
    int GetBegin() const;
    void SetBegin(int begin);
    int GetCcp() const;
    void SetCcp(int ccp);
    ChpProp GetChpProp() const;
    void SetChpProp(ChpProp prop);
    // ChpProp1 GetChpProp1() const;
    // void SetChpProp1(ChpProp1 prop);
    // void SetChpProp2(ChpProp1 prop1, ChpProp prop);
    // ChpProp1 m_prop_1;

private:
    int m_begin_;
    int m_ccp_;
    ChpProp m_prop_;
    // ChpProp1 m_prop_1;
};

//tag:object of Pap array
class PabsObject
{
public:
    PabsObject();
    PabsObject(const PabsObject& pabsobj);
    int GetBegin() const;
    void SetBegin(int begin);
    int GetCcp() const;
    void SetCcp(int ccp);
    PapProp GetPapProp() const;
    void SetPapProp(PapProp prop);

private:
    int m_begin_;
    int m_ccp_;
    PapProp m_prop_;
};

// Chp array
class ChpData
{
public:
    ChpData();
    ChpData(const ChpData& cdata);
    vector<CabsObject *> GetCarray() const;
    CabsObject GetCabsObject() const;
    // CabsObject GetCabsObject() const;
    void SetCabsObject(CabsObject cabsobject);
    // CabsObject m_cabsobject;

private:
    vector<CabsObject *> m_carray;
    CabsObject m_cabsobject;
};

// Pap array
class PapData
{
public:
    PapData();
    PapData(const PapData& pdata);
    vector<PabsObject *> GetParray() const;
    PabsObject GetPabsObject() const;
    // CabsObject GetCabsObject() const;
    void SetPabsObject(PabsObject pabsobject);

private:
    vector<PabsObject *> m_parray;
    PabsObject m_pabsobject;
};

class ChpTbl
{
public:
    ChpTbl();
    ChpTbl(const ChpTbl& chptbl);
    ChpData GetData() const;
    void SetData(ChpData data);

// private:
    ChpData c_data_;
};

class PapTbl
{
public:
    PapTbl();
    PapTbl(const PapTbl& paptbl);
    PapData GetDataP() const;
    void SetDataP(PapData data);

// private:
    PapData p_data_;
};

class TextStream
{

public:
    TextStream();
    TextStream(const TextStream& textstream);
    string GetText() const;
    void SetText(string text);
    ChpTbl GetChpTbl() const;
    void SetChpTbl(ChpTbl chptbl);
    PapTbl GetPapTbl() const;
    void SetPapTbl(PapTbl paptbl);

private:
    string m_text_;
    ChpTbl m_chptbl_;
    PapTbl m_paptbl_;
};

#endif